{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- muduo"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "shellscript"
    }
   },
   "outputs": [],
   "source": [
    "! g++ -std=c++20 bounded_queue.cpp -o bounded_queue -pthread && ./bounded_queue"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "shellscript"
    }
   },
   "outputs": [],
   "source": [
    "! g++ -std=c++20 muduo_control.cpp -o muduo_control -pthread && ./muduo_control"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# highWaterMark/lowWaterMark "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "高低水位控制是一种流量控制机制，通过监控缓冲区容量并在达到特定阈值时触发相应动作来平衡生产和消费速率。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "核心组件\n",
    "\n",
    "```shell\n",
    "[生产者] -> [缓冲区] -> [消费者]\n",
    "     ↑          |\n",
    "   控制信号   水位监控\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "关键参数\n",
    "- highWaterMark: 高水位阈值\n",
    "- lowWaterMark: 低水位阈值\n",
    "- currentSize: 当前大小\n",
    "- pauseFlag: 暂停标志"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "实现方式"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "// 生产者控制\n",
    "if (currentSize >= highWaterMark) {\n",
    "    pauseFlag = true;\n",
    "    等待降至低水位;\n",
    "}\n",
    "\n",
    "// 消费者控制\n",
    "if (currentSize <= lowWaterMark && pauseFlag) {\n",
    "    pauseFlag = false;\n",
    "    通知生产者恢复;\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**实现类型**\n",
    "\n",
    "阻塞式\n",
    "- 使用条件变量实现等待/通知\n",
    "- 生产者在高水位时完全阻塞\n",
    "\n",
    "非阻塞式\n",
    "- 生产者在高水位时返回错误\n",
    "- 通过状态标志控制流量\n",
    "\n",
    "异步式\n",
    "- 注册回调函数\n",
    "- 水位变化时触发回调"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**自适应机制**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "class AdaptiveBoundedQueue {\n",
    "    void updatePressure() {\n",
    "        if (队列达到高水位) {\n",
    "            增加压力计数;\n",
    "            if (持续压力 && 达到调整周期) {\n",
    "                提高水位阈值;\n",
    "            }\n",
    "        }\n",
    "    }\n",
    "    \n",
    "    void checkPressureRelease() {\n",
    "        if (队列低于低水位 && 无压力持续时间足够) {\n",
    "            降低水位阈值;\n",
    "            重置压力计数;\n",
    "        }\n",
    "    }\n",
    "}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "关键参数\n",
    "- adjustFactor: 调整因子\n",
    "- pressureCount: 压力计数器\n",
    "- maxWaterMark: 最大水位限制\n",
    "- adjustInterval: 调整间隔"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "应用场景\n",
    "\n",
    "| 应用类型   | 具体场景     | 水位指标                                           | 控制机制                                         | 特点                                           | 示例                                    |\n",
    "| ---------- | ------------ | -------------------------------------------------- | ------------------------------------------------ | ---------------------------------------------- | --------------------------------------- |\n",
    "| 网络服务器 | TCP连接管理  | - 连接数量<br>- 发送缓冲区大小<br>- 接收缓冲区大小 | - 拒绝新连接<br>- 降低发送速率<br>- 调整窗口大小 | - 实时性要求高<br>- 需要快速响应<br>- 双向流控 | - Nginx<br>- Muduo<br>- Redis           |\n",
    "| 消息队列   | 消息堆积处理 | - 队列长度<br>- 内存占用<br>- 消息总大小           | - 限制生产速率<br>- 扩展消费者<br>- 持久化降级   | - 可靠性要求高<br>- 支持持久化<br>- 削峰填谷   | - RabbitMQ<br>- Kafka<br>- RocketMQ     |\n",
    "| 数据库     | 写入缓冲管理 | - WAL大小<br>- 查询队列长度<br>- 缓存使用量        | - 写入限流<br>- 查询排队<br>- 缓存淘汰           | - 数据一致性<br>- 事务支持<br>- 资源隔离       | - MySQL<br>- PostgreSQL<br>- MongoDB    |\n",
    "| 日志系统   | 日志收集处理 | - 日志缓冲区大小<br>- 处理队列长度<br>- 磁盘使用量 | - 日志丢弃<br>- 批量处理<br>- 压缩存储           | - 高吞吐量<br>- 可丢失容忍<br>- 异步处理       | - ELK Stack<br>- Fluentd<br>- Logstash  |\n",
    "| 流式处理   | 实时数据处理 | - 处理管道积压<br>- 内存使用量<br>- CPU负载        | - 源端限流<br>- 并行扩展<br>- 负载均衡           | - 低延迟<br>- 顺序保证<br>- 动态伸缩           | - Flink<br>- Storm<br>- Spark Streaming |\n",
    "| 缓存系统   | 缓存容量管理 | - 内存占用<br>- 请求队列长度<br>- 缓存命中率       | - LRU淘汰<br>- 过期清理<br>- 容量限制            | - 快速响应<br>- 空间受限<br>- 热点处理         | - Redis<br>- Memcached<br>- Caffeine    |\n",
    "| 任务调度   | 任务队列管理 | - 等待队列长度<br>- 运行任务数<br>- 资源使用率     | - 任务延迟<br>- 优先级调度<br>- 资源限制         | - 优先级保证<br>- 资源隔离<br>- 弹性调度       | - K8s<br>- Yarn<br>- Mesos              |\n",
    "| 实时计算   | 计算资源管理 | - 计算队列深度<br>- 内存使用量<br>- 计算延迟       | - 负载均衡<br>- 任务迁移<br>- 资源调配           | - 实时性要求<br>- 计算密集<br>- 动态调整       | - Storm<br>- Flink<br>- Samza           |"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "C++17",
   "language": "C++17",
   "name": "xcpp17"
  },
  "language_info": {
   "codemirror_mode": "text/x-c++src",
   "file_extension": ".cpp",
   "mimetype": "text/x-c++src",
   "name": "C++17",
   "version": "17"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
